gusucode.com > VC++ 磁盘文件编辑器 > VC++ 磁盘文件编辑器/gusucode/hexedit.cpp
//Download by http://www.NewXing.com /****************************************** * CO. : AnSon(ShunDe) CO.,LTD. * * programmer : AnSon.Man * * Tel : 13302331339 * * E-Mail : manaibao@tom.com * ******************************************/ /////////////////////////////////////////// ////// AnSon Hex Editor ///////// /////////////////////////////////////////// //#define STRICT #include <windows.h> #include <winbase.h> #include <commdlg.h> #include "hexedit.h" #define TimerInterval 500 #define MyWinX 640 #define MyWinY 512 /* _lopen() flags */ #define READ 0 #define WRITE 1 #define READ_WRITE 2 //************************************************************ //*********Local Function Prototypes************************** int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow); BOOL InitApplication( HINSTANCE hInstance ); BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ); LRESULT CALLBACK WndProc( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam ); BOOL CALLBACK ModifyDlgProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); void ReDrawImage( HWND hWnd ); BOOL GetFileName( HWND hWnd, char FAR* lpBMPFileName, char FAR* lpstrFilter, DWORD dwFilterIndex, BOOL blOpenOrSave ); BOOL CommandStrProc( HWND hWnd ); int char2int(char a); char CHAR2HEXTXT(char a); void WORD2CHAR(char FAR* a, WORD b); char WORD2CHARINDEX(WORD b, int index); BYTE char2byte(char a); BOOL GetCmdLineValue(long FAR* lngTemp); /**************************************************************************** /****************************************************************************/ /* Global Variables */ HINSTANCE hInst; HWND hWndMain; char szAppName[] = "HEXEDITOR"; char szTitle[128] = "Hex Editor - AnSon"; char szHelpFileName[] = "HEXEDIT.HLP"; char szTaskIsRunning[] = "You HEX EDITOR is running now!"; char szTimerIsTooMany[] = "The Timer is too many to be created!"; char szGetOpenFileNameErr[] = "Get the FileName False!"; char szFileNameFilter[] ="All Files (*.*)\0*.*\0bmp file (*.bmp)\0*.bmp\0\0"; char szFileHasBeenOpened[] = "One File Has been Opened!\n\nOpen the other one, close it first."; char szFileHasNotBeenOpened[] = "No File has been opened!"; char szFileOpenError[] = "Open the File False! Perhaps it is ReadOnly."; char szFileSaveError[] = "Save the File False!"; char szCreateFileError[] = "Create file False!\nPerhaps the disk has not enough space, or you has no purview."; char szEndOfFile[] = "End of the file!"; char szTheTextNoFine[] = "The specific text not found!"; char szYourInputError[] = "Perhaps your input is error, such as it is not HexFormat, etc."; char szInputNoError[] = "Tips: You input is OK!"; char szInputError[] = "Tips: You input is Error, check it please!"; char szAboutStr[] = "AnSon(R) HEX Editor.\n\nWritten by AnSon.Man(满爱宝) in Mar, 2007."; char szNoError[] = "That has no Error!"; char szHelp00[] = "********************************************************************************"; char szHelp01[] = "********** AnSon(R) HEX Editor. Written by AnSon.Man in Mar, 2007. ***********"; char szHelp02[] = "********************************************************************************"; char szHelp03[] = "? - Display the Help Message."; char szHelp04[] = "O - Open one file."; char szHelp05[] = "N - Input the file name and open it."; char szHelp06[] = "D - Display the FileData, HEX format. Next Page."; char szHelp07[] = "Dxxxx - Display the FileData, HEX format, special the File Position."; char szHelp08[] = "Dxxxx:xxxx - Display the FileData, HEX format, special the File Position."; char szHelp09[] = "E - Modify the FileData, HEX format, current position."; char szHelp10[] = "Exxxx - Modify the FileData, HEX format, special the File Position."; char szHelp11[] = "Exxxx:xxxx - Modify the FileData, HEX format, special the File Position."; char szHelp12[] = "Wxxxx - Write the FileData, bin format, special the DataByteCount."; char szHelp13[] = "Wxxxx:xxxx - Write the FileData, bin format, special the DataByteCount."; char szHelp14[] = "F - Fcxxx, fine text:'xxx'; fhxx-xx-xx, fine hex byte; Fn,fine next."; char szHelp15[] = "C - Close the file."; char szHelp16[] = "Q - Exit HEX EDITOR."; char szHelp17[] = "B - Change the BackColor and the ForeColor."; char szHelp18[] = "A - About HEX EDITOR."; char szHelp19[] = "This tool is use to edit the file data use hex format, you can open the normal"; char szHelp20[] = "file on you disk, and edit/modify the data. The file size can up to 4G bytes."; char szHelp21[] = "you can save part of the file from the position of display, use W command."; char szHelp22[] = "It is easy to use, to modify data, to save data; quickly save file even the"; char szHelp23[] = "file size is very big. It occupy least CPU time, least memory room."; char szHelp24[] = "It is very GREEN to you computer system, no any waste to be produced."; char szHelp25[] = "Notice: When you modify the FileData, it will be save to the file when you"; char szHelp26[] = " close the file or exit the HEXEDITOR, and no any warning."; char szObjFileName[256]= {'\0'}; char szWriteFileName[256]= {'\0'}; BYTE szScreenCache[80][32]; BYTE byteDataBuff[480]; BYTE szFineText[128] = {'\0'}; HFILE hFileToOpen; BOOL blHasBeenOpened=FALSE; BOOL blEndOfFile = FALSE; BOOL blCheckBox = FALSE; int intBackColor = 2; HBITMAP hBitMapASCII; HDC hDcMemASCII; int intPosX=0, intPosY=0; int intFineTextByteLen = 0; long lngFilePos=0, lngModifyPos=0, lngDisPos=0; DWORD dwWriteByteCount; /****************************************************************************/ /**************************************************************************** * * FUNCTION: WinMain * * PURPOSE: Main entry point for this app * * PARAMS: HANDLE hInstance - This instance * HANDLE hPrevInstance - Previous instance * LPSTR lpszCmdLine - Command Line * int nCmdShow - Desired window status * * RETURNS: int - return code * * History: * July '95 - Created * \****************************************************************************/ // Turn off warning: Parameter 'lpszCmdLine' is never used in function WinMain(unsigned int,unsigned int,char far*,int) //#pragma argsused int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { MSG msg; HWND hWndExist; hWndExist = FindWindow(szAppName, szTitle); if(hWndExist != NULL) { FlashWindow(hWndExist, TRUE); MessageBox( hWndExist, szTaskIsRunning, szTitle, MB_OK); return FALSE; } // standard init stuff if( ! hPrevInstance ) { if( ! InitApplication( hInstance ) ) { return FALSE; } } if( ! InitInstance( hInstance, nCmdShow ) ) { return FALSE; } // Standard message loop while (GetMessage(&msg, (HWND) NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } /* End WinMain() ************************************************************/ /**************************************************************************** * * FUNCTION: InitApplication * * PURPOSE: Register classes * * PARAMS: HINSTANCE hInstance - This instance * * RETURNS: BOOL - TRUE for success, FALSE for failure * * History: * July '95 - Created * \****************************************************************************/ BOOL InitApplication( HINSTANCE hInstance ) { int i,j; WNDCLASS wc; for(i=0;i<80;i++) for(j=0;j<32;j++) szScreenCache[i][j]=' '; for(i=0;i<80;i++) szScreenCache[i][30]=6; szScreenCache[3][30]='C'; szScreenCache[4][30]='o'; szScreenCache[5][30]='m'; szScreenCache[6][30]='m'; szScreenCache[7][30]='a'; szScreenCache[8][30]='n'; szScreenCache[9][30]='d'; szScreenCache[10][30]=' '; szScreenCache[11][30]='L'; szScreenCache[12][30]='i'; szScreenCache[13][30]='n'; szScreenCache[14][30]='e'; wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hIcon = LoadIcon( hInstance, "HEXEDITICON" ); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)GetStockObject( NULL_BRUSH );//GRAY_BRUSH, NULL_BRUSH r58,g110,b165 wc.lpszMenuName = NULL; wc.lpszClassName = szAppName; return( RegisterClass( &wc ) ); } /* End InitApplication() ***************************************************/ /**************************************************************************** * * FUNCTION: InitInstance * * PURPOSE: Create and show the main window * * PARAMS: HANDLE hInstance - This instance * int nCmdShow - desired show state * * RETURNS: BOOL - TRUE for success, FALSE for failure * * History: * July '95 - Created * \****************************************************************************/ BOOL InitInstance( HINSTANCE hInstance, int nCmdShow ) { RECT DeskRect; int xSize,ySize; hInst = hInstance; GetWindowRect( GetDesktopWindow(), &DeskRect ); xSize = GetSystemMetrics(SM_CXDLGFRAME)*2+MyWinX; ySize = GetSystemMetrics(SM_CYDLGFRAME)*2+MyWinY+ GetSystemMetrics(SM_CYCAPTION); hWndMain = CreateWindow( szAppName, szTitle, WS_DLGFRAME | WS_MINIMIZEBOX | WS_SYSMENU, //WS_OVERLAPPEDWINDOW, //WS_SYSMENU | WS_MINIMIZEBOX | WS_THICKFRAME, // (DeskRect.right - xSize ) / 2, //DeskRect.right / 4 (DeskRect.bottom - ySize ) / 2, //DeskRect.bottom / 4 xSize, // window's Width initialize ySize, // window's Height initialize NULL, NULL, hInstance, NULL ); if( hWndMain == NULL ) { return FALSE; } ShowWindow( hWndMain, nCmdShow ); UpdateWindow( hWndMain ); return TRUE; } /* End InitInstance() *****************************************************/ /**************************************************************************** * * FUNCTION: WndProc * * PURPOSE: Window Procedure for the main window. * * PARAMS: HWND hWnd - This window * UINT Message - Which message? * WPARAM wParam - message parameter * LPARAM lParam - message parameter * * RETURNS: LRESULT - depends on message * * History: * July '95 - Created * \****************************************************************************/ LRESULT CALLBACK WndProc( HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam ) { // which message are we handling? switch( Message ) { case WM_PAINT: ReDrawImage( hWndMain ); break; // end WM_PAINT case WM_TIMER: if(szScreenCache[intPosX][31] == '_') szScreenCache[intPosX][31] = ' '; else szScreenCache[intPosX][31] = '_'; InvalidateRect( hWnd, NULL, TRUE ); break; case WM_CREATE: { HDC hDC = GetDC(hWnd); hBitMapASCII = LoadBitmap(hInst, "ASCIIFONT"); hDcMemASCII = CreateCompatibleDC( hDC ); SelectObject( hDcMemASCII, hBitMapASCII ); ReleaseDC( hWnd, hDC ); } if (!SetTimer(hWnd, ID_Timer, TimerInterval, NULL)) MessageBox(hWnd, szTimerIsTooMany, szTitle, MB_ICONEXCLAMATION | MB_OK); PostMessage(hWnd, WM_CHAR, '?', 0l); PostMessage(hWnd, WM_CHAR, ' ', 0l); break; // End WM_CREATE case WM_KEYDOWN: if( ! blHasBeenOpened ) break; if( LOWORD( wParam ) == '!' ) { PostMessage(hWnd, WM_CHAR, 'd', 0l); PostMessage(hWnd, WM_CHAR, '-', 0l); PostMessage(hWnd, WM_CHAR, ' ', 0l); } else if( LOWORD( wParam ) == '"' ) { PostMessage(hWnd, WM_CHAR, 'd', 0l); PostMessage(hWnd, WM_CHAR, ' ', 0l); } else if( LOWORD( wParam ) == '(' ) { PostMessage(hWnd, WM_CHAR, 'd', 0l); PostMessage(hWnd, WM_CHAR, '_', 0l); PostMessage(hWnd, WM_CHAR, ' ', 0l); } else if( LOWORD( wParam ) == '&' ) { PostMessage(hWnd, WM_CHAR, 'd', 0l); PostMessage(hWnd, WM_CHAR, '~', 0l); PostMessage(hWnd, WM_CHAR, ' ', 0l); } else if( LOWORD( wParam ) == '$' ) { PostMessage(hWnd, WM_CHAR, 'd', 0l); PostMessage(hWnd, WM_CHAR, '0', 0l); PostMessage(hWnd, WM_CHAR, '0', 0l); PostMessage(hWnd, WM_CHAR, '0', 0l); PostMessage(hWnd, WM_CHAR, '0', 0l); PostMessage(hWnd, WM_CHAR, ':', 0l); PostMessage(hWnd, WM_CHAR, '0', 0l); PostMessage(hWnd, WM_CHAR, '0', 0l); PostMessage(hWnd, WM_CHAR, '0', 0l); PostMessage(hWnd, WM_CHAR, '0', 0l); PostMessage(hWnd, WM_CHAR, ' ', 0l); } else if( LOWORD( wParam ) == '#' ) { lngFilePos = _llseek(hFileToOpen, 0, SEEK_END) - 480; if(lngFilePos<0)lngFilePos=0; PostMessage(hWnd, WM_CHAR, 'd', 0l); PostMessage(hWnd, WM_CHAR, ' ', 0l); } break; case WM_CHAR: if( LOWORD( wParam ) == 0x0D || LOWORD( wParam ) == 0x20 ) { CommandStrProc( hWnd ); InvalidateRect( hWnd, NULL, TRUE ); break; } if( LOWORD( wParam ) == 0x08 ) { if(intPosX != 0) { intPosX--; szScreenCache[intPosX ][31] = ' '; szScreenCache[intPosX+1][31] = ' '; } InvalidateRect( hWnd, NULL, TRUE ); break; } if( VK_ESCAPE == LOWORD( wParam ) ) { int i; for(i=0;i<80;i++)szScreenCache[i][31]=' '; intPosX = 0; InvalidateRect( hWnd, NULL, TRUE ); break; } if(intPosX==79)break; szScreenCache[intPosX][31]=( LOWORD( wParam ) < 128 && LOWORD( wParam ) >= ' ' )? (BYTE)( LOWORD( wParam ) ) : '.'; intPosX++; InvalidateRect( hWnd, NULL, TRUE ); break; case WM_KILLFOCUS: break; //****************************************** //The menu command processer is putted here. //****************************************** // Command Messages (menu items, etc) case WM_COMMAND: switch (LOWORD( wParam )) { case IDC_OPENDLG: break; default: ; } break; // End WM_COMMAND //****************************************** //End of menu command processor. //****************************************** // Time to close down now :( case WM_CLOSE: if(blHasBeenOpened)_lclose(hFileToOpen); KillTimer(hWnd, ID_Timer); DeleteObject(hBitMapASCII); DeleteDC( hDcMemASCII ); DestroyWindow( hWnd ); PostQuitMessage( 0 ); break; // End WM_CLOSE // Pass it on to the default window procedure default: return DefWindowProc( hWnd, Message, wParam, lParam ); } return DefWindowProc( hWnd, Message, wParam, lParam ); } /* End WndProc() ***********************************************************/ /**************************************************************************** * * FUNCTION: ReDrawImage * * PURPOSE: ReDraws the foreground * * PARAMS: HWND hWnd - The window's handl * HDC hDC - The DC on which to draw * * RETURNS: void * * History: * July '95 - Created * DEC 2006 - modified by AnSon.Man * \****************************************************************************/ void ReDrawImage( HWND hWnd ) { PAINTSTRUCT ps; HDC hDC; int intX, intY, rs; hDC = BeginPaint( hWnd, &ps ); for(intX=0; intX<80; intX++) for(intY=0; intY<32; intY++) { rs = szScreenCache[intX][intY]; if( rs>'~' )rs='?'; BitBlt(hDC, intX * 8, intY * 16, 8, 16, hDcMemASCII, rs*8, intBackColor * 16, SRCCOPY); } EndPaint( hWnd, &ps ); ReleaseDC( hWnd, hDC); return; } /* End ReDrawImage() ***************************************************/ /**************************************************************************** * * FUNCTION: GetFileName( HWND hWnd, char FAR* lpFileName, char FAR* lpstrFilter, DWORD dwFilterIndex, blOpenOrSave ) * * PURPOSE: Get the open file name to open. * * PARAMS: HWND hWnd - The window's handl * char FAR* lpFileName - the return FileName's pointer * char FAR* lpstrFilter - the lpstrFilter's pointer * DWORD dwFilterIndex - the filter's index. * * * RETURNS: BOOL * * History: * July '95 - Created * DEC 2006 - modified by AnSon.Man * \****************************************************************************/ BOOL GetFileName( HWND hWnd, char FAR* lpFileName, char FAR* lpstrFilter, DWORD dwFilterIndex, BOOL blOpenOrSave ) { OPENFILENAME ofn; DWORD Errval; // Error value BOOL blrt; //****************************************** //Get the open file name. //****************************************** ofn.lStructSize = sizeof( OPENFILENAME ); ofn.hwndOwner = hWnd; // An invalid hWnd causes non-modality ofn.hInstance = 0; ofn.lpstrFilter = lpstrFilter; // See previous note concerning string ofn.lpstrCustomFilter = NULL; ofn.nMaxCustFilter = 0; ofn.nFilterIndex = dwFilterIndex; ofn.lpstrFile = lpFileName; // Stores the result in this variable ofn.nMaxFile = 256; ofn.lpstrFileTitle = NULL; ofn.nMaxFileTitle = 0; ofn.lpstrInitialDir = NULL; if ( blOpenOrSave ) { ofn.lpstrTitle = "Open"; // Title for dialog ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST; ofn.lpstrDefExt = "*"; } else { ofn.lpstrTitle = "Save"; // Title for dialog ofn.Flags = OFN_OVERWRITEPROMPT; ofn.lpstrDefExt = ""; } ofn.nFileOffset = 0; ofn.nFileExtension = 0; ofn.lCustData = NULL; ofn.lpfnHook = NULL; ofn.lpTemplateName = NULL; if ( blOpenOrSave ) blrt = GetOpenFileName( &ofn ); else blrt = GetSaveFileName( &ofn ); if( ! blrt) { Errval=CommDlgExtendedError(); if(Errval!=0)// 0 value means user selected Cancel { MessageBox(hWnd, szGetOpenFileNameErr, szTitle, MB_OK|MB_ICONSTOP); } return FALSE; } return TRUE; } /* End GetFileName() ***************************************************/ /**************************************************************************** * * FUNCTION: CommandStrProc() * * PURPOSE: Proc the string command. * * PARAMS: HWND hWnd - The window's handl * * RETURNS: BOOL * * History: * Mar 2007 - Created by AnSon.Man * \****************************************************************************/ BOOL CommandStrProc( HWND hWnd ) { int i,j,k,intTemp; DWORD dwTemp=0, dwTemp0; DWORD dwIndex=0; HFILE hWriteFile; LPCSTR lpcwbf; lpcwbf = (LPCSTR)byteDataBuff; long lngOldPos = lngDisPos; long lngByteCount = 0; BOOL blCheckIt; switch (szScreenCache[0][31]) { case 'Q': case 'q': PostMessage(hWnd, WM_CLOSE, 0l, 0l); break; case '?': for(i=0;i<80;i++) for(j=0;j<30;j++) szScreenCache[i][j] = ' '; i = 0; j = 0; while(szHelp00[i] != '\0'){szScreenCache[i][j] = szHelp00[i];i++;} i = 0; j++; while(szHelp01[i] != '\0'){szScreenCache[i][j] = szHelp01[i];i++;} i = 0; j++; while(szHelp02[i] != '\0'){szScreenCache[i][j] = szHelp02[i];i++;} i = 0; j++; while(szHelp03[i] != '\0'){szScreenCache[i][j] = szHelp03[i];i++;} i = 0; j++; while(szHelp04[i] != '\0'){szScreenCache[i][j] = szHelp04[i];i++;} i = 0; j++; while(szHelp05[i] != '\0'){szScreenCache[i][j] = szHelp05[i];i++;} i = 0; j++; while(szHelp06[i] != '\0'){szScreenCache[i][j] = szHelp06[i];i++;} i = 0; j++; while(szHelp07[i] != '\0'){szScreenCache[i][j] = szHelp07[i];i++;} i = 0; j++; while(szHelp08[i] != '\0'){szScreenCache[i][j] = szHelp08[i];i++;} i = 0; j++; while(szHelp09[i] != '\0'){szScreenCache[i][j] = szHelp09[i];i++;} i = 0; j++; while(szHelp10[i] != '\0'){szScreenCache[i][j] = szHelp10[i];i++;} i = 0; j++; while(szHelp11[i] != '\0'){szScreenCache[i][j] = szHelp11[i];i++;} i = 0; j++; while(szHelp12[i] != '\0'){szScreenCache[i][j] = szHelp12[i];i++;} i = 0; j++; while(szHelp13[i] != '\0'){szScreenCache[i][j] = szHelp13[i];i++;} i = 0; j++; while(szHelp14[i] != '\0'){szScreenCache[i][j] = szHelp14[i];i++;} i = 0; j++; while(szHelp15[i] != '\0'){szScreenCache[i][j] = szHelp15[i];i++;} i = 0; j++; while(szHelp16[i] != '\0'){szScreenCache[i][j] = szHelp16[i];i++;} i = 0; j++; while(szHelp17[i] != '\0'){szScreenCache[i][j] = szHelp17[i];i++;} i = 0; j++; while(szHelp18[i] != '\0'){szScreenCache[i][j] = szHelp18[i];i++;} i = 0; j++; j++; while(szHelp19[i] != '\0'){szScreenCache[i][j] = szHelp19[i];i++;} i = 0; j++; while(szHelp20[i] != '\0'){szScreenCache[i][j] = szHelp20[i];i++;} i = 0; j++; while(szHelp21[i] != '\0'){szScreenCache[i][j] = szHelp21[i];i++;} i = 0; j++; while(szHelp22[i] != '\0'){szScreenCache[i][j] = szHelp22[i];i++;} i = 0; j ++; while(szHelp23[i] != '\0'){szScreenCache[i][j] = szHelp23[i];i++;} i = 0; j++; while(szHelp24[i] != '\0'){szScreenCache[i][j] = szHelp24[i];i++;} i = 0; j++; j++; while(szHelp25[i] != '\0'){szScreenCache[i][j] = szHelp25[i];i++;} i = 0; j++; while(szHelp26[i] != '\0'){szScreenCache[i][j] = szHelp26[i];i++;} break; case 'E': case 'e': if(!blHasBeenOpened) { MessageBox(hWnd, szFileHasNotBeenOpened, szTitle, MB_OK | MB_ICONASTERISK); break; } if( ! GetCmdLineValue( & lngModifyPos ) ) break; DialogBox( hInst, MAKEINTRESOURCE(IDD_MODIFYDLG), hWnd, ModifyDlgProc ); break; case 'D': case 'd': if(!blHasBeenOpened) { MessageBox(hWnd, szFileHasNotBeenOpened, szTitle, MB_OK | MB_ICONASTERISK); break; } if( ! GetCmdLineValue( & lngFilePos ) ) { if (intPosX == 2 && szScreenCache[1][31] == '-') lngFilePos -= 960; else if (intPosX == 2 && szScreenCache[1][31] == '_') lngFilePos -= 464; else if (intPosX == 2 && szScreenCache[1][31] == '~') lngFilePos -= 496; else break; if(lngFilePos <= 0 )lngFilePos = 0; } dwTemp0 = lngFilePos; _llseek(hFileToOpen, lngFilePos, SEEK_SET); dwTemp = _lread(hFileToOpen, byteDataBuff, 480); if(dwTemp<480)blEndOfFile=TRUE; else blEndOfFile=FALSE; lngDisPos = lngFilePos; lngFilePos = lngFilePos + dwTemp; for(i=0;i<80;i++) for(j=0;j<30;j++) szScreenCache[i][j] = ' '; i=11; k=j=0; for(dwIndex=0;dwIndex<480;dwIndex++) { szScreenCache[0][j] = WORD2CHARINDEX(HIWORD(dwTemp0), 0); szScreenCache[1][j] = WORD2CHARINDEX(HIWORD(dwTemp0), 1); szScreenCache[2][j] = WORD2CHARINDEX(HIWORD(dwTemp0), 2); szScreenCache[3][j] = WORD2CHARINDEX(HIWORD(dwTemp0), 3); szScreenCache[4][j] = ':'; szScreenCache[5][j] = WORD2CHARINDEX(LOWORD(dwTemp0), 0); szScreenCache[6][j] = WORD2CHARINDEX(LOWORD(dwTemp0), 1); szScreenCache[7][j] = WORD2CHARINDEX(LOWORD(dwTemp0), 2); szScreenCache[8][j] = WORD2CHARINDEX(LOWORD(dwTemp0), 3); if(dwIndex<dwTemp) { szScreenCache[i ][j] = ( byteDataBuff[dwIndex] & 0xf0 ) >> 4; szScreenCache[i+1][j] = ( byteDataBuff[dwIndex] & 0x0f ); szScreenCache[i ][j] = (szScreenCache[i ][j] <= 9)?(szScreenCache[i ][j] + 48):(szScreenCache[i ][j] + 55); szScreenCache[i+1][j] = (szScreenCache[i+1][j] <= 9)?(szScreenCache[i+1][j] + 48):(szScreenCache[i+1][j] + 55); szScreenCache[k+61][j] = (byteDataBuff[dwIndex] < 127 && byteDataBuff[dwIndex] >= ' ')?(byteDataBuff[dwIndex]):'.'; } else { szScreenCache[i ][j] = ' '; szScreenCache[i+1 ][j] = ' '; szScreenCache[k+61][j] = ' '; } k++; if(k==8)szScreenCache[i+2][j] = '-'; else szScreenCache[i+2][j] = ' '; i += 3; if ( k == 16 ){ k=0; i=11; j++;dwTemp0 += 16; } } break; case 'F': case 'f': if(!blHasBeenOpened) { MessageBox(hWnd, szFileHasNotBeenOpened, szTitle, MB_OK | MB_ICONASTERISK); break; } if(intPosX<2)break; blCheckIt = FALSE; switch (szScreenCache[1][31]) { case 'N': case 'n': k=intFineTextByteLen; lngDisPos++; blCheckIt = TRUE; break; case 'C': case 'c': if(intPosX<3)break; for(i=2;i<intPosX;i++)szFineText[i-2] = szScreenCache[i][31]; szFineText[i-2]='\0'; k=intPosX-2; intFineTextByteLen = k; blCheckIt = TRUE; break; case 'H': case 'h': if(intPosX<4)break; k=intPosX-2; if(((k-2)%3) != 0)break; k= ( k - 2 ) / 3 + 1; intFineTextByteLen = k; j=0; for(i=2;i<intPosX;i+=3) { if( -1 == char2int( szScreenCache[i ][31]) ){blCheckIt = FALSE;break;} if( -1 == char2int( szScreenCache[i+1][31]) ){blCheckIt = FALSE;break;} szFineText[j] = char2byte( szScreenCache[i][31] ) * 16 + char2byte( szScreenCache[i+1][31] ); j++;blCheckIt = TRUE; } break; default: break; } if( ( ! blCheckIt ) || k==0 ) { MessageBox(hWnd, szYourInputError, szTitle, MB_OK | MB_ICONASTERISK); break; } blEndOfFile = FALSE; blCheckIt = TRUE; lngFilePos = lngDisPos; while( ! blEndOfFile ) { _llseek(hFileToOpen, lngFilePos, SEEK_SET); intTemp = _lread(hFileToOpen, byteDataBuff, 480); if(intTemp<k)break; if(intTemp<480) { for(j=0;j<intTemp-k;j++); { blCheckIt = TRUE; for(i=0;i<k;i++) { if( byteDataBuff[j+i] != szFineText[i] ) { blCheckIt=FALSE;break; } } if(blCheckIt)break; } blEndOfFile=TRUE; } else { for(j=0;j<480-k;j++) { blCheckIt = TRUE; for(i=0;i<k;i++) { if( byteDataBuff[j+i] != szFineText[i] ) { blCheckIt=FALSE;break; } } if(blCheckIt)break; } blEndOfFile=FALSE; lngDisPos = lngFilePos; lngFilePos = lngFilePos + 480 - k; if(blCheckIt){lngDisPos += j;break;} } } if(blCheckIt) { lngFilePos = lngDisPos; } else { lngFilePos = lngOldPos; MessageBox(hWnd, szTheTextNoFine, szTitle, MB_OK | MB_ICONASTERISK); } PostMessage(hWnd, WM_CHAR, VK_ESCAPE, 0l); PostMessage(hWnd, WM_CHAR, 'd', 0l); PostMessage(hWnd, WM_CHAR, ' ', 0l); break; case 'O': case 'o': if(blHasBeenOpened) { MessageBox(hWnd, szFileHasBeenOpened, szTitle, MB_OK | MB_ICONASTERISK); break; } //Get file name if( GetFileName( hWnd, szObjFileName, szFileNameFilter, 1, TRUE ) ) { for(j=15;j<80;j++)szScreenCache[j][30] = 6; j=0; while(szObjFileName[j] != '\0')j++; for(i=0;i<j;i++) if( (61 + i) > j)szScreenCache[77-j + i][30] = szObjFileName[i]; //open it hFileToOpen = _lopen(szObjFileName, READ_WRITE); if(hFileToOpen == -1) { MessageBox(hWnd, szFileOpenError, szTitle, MB_OK | MB_ICONSTOP); for(j=15;j<80;j++)szScreenCache[j][30] = 6; blHasBeenOpened = FALSE; } else blHasBeenOpened = TRUE; } PostMessage(hWnd, WM_CHAR, 'd', 0l); PostMessage(hWnd, WM_CHAR, ' ', 0l); break; case 'N': case 'n': if(blHasBeenOpened) { MessageBox(hWnd, szFileHasBeenOpened, szTitle, MB_OK | MB_ICONASTERISK); break; } //Get file name if(intPosX<5)break; for(j=15;j<80;j++)szScreenCache[j][30] = 6; for(i=1;i<intPosX;i++) { szObjFileName[i-1] = szScreenCache[i][31]; if( (61 + i) > intPosX)szScreenCache[77-intPosX + i][30] = szScreenCache[i][31]; } szObjFileName[i-1]='\0'; //open it hFileToOpen = _lopen(szObjFileName, READ_WRITE); if(hFileToOpen == -1) { MessageBox(hWnd, szFileOpenError, szTitle, MB_OK | MB_ICONSTOP); for(j=15;j<80;j++)szScreenCache[j][30] = 6; blHasBeenOpened = FALSE; } else blHasBeenOpened = TRUE; break; case 'W': case 'w': if( ! blHasBeenOpened) { MessageBox(hWnd, szFileHasNotBeenOpened, szTitle, MB_OK | MB_ICONASTERISK); break; } if(intPosX<5)break; if( ! GetCmdLineValue( & lngByteCount ) ) break; if( GetFileName( hWnd, szWriteFileName, szFileNameFilter, 1, FALSE ) ) { hWriteFile = _lcreat( szWriteFileName, 0 ); if (hWriteFile == -1) { MessageBox(hWnd, szCreateFileError, szTitle, MB_OK | MB_ICONSTOP ); break; } dwTemp0 = 0; _llseek(hFileToOpen, lngOldPos, SEEK_SET); dwTemp = _lread(hFileToOpen, byteDataBuff, 480); lngOldPos = lngOldPos + dwTemp; while(dwTemp != 0) { dwTemp0 = dwTemp0 + dwTemp; if ( lngByteCount < (long)dwTemp0 )dwTemp = lngByteCount - (dwTemp0-dwTemp); _hwrite(hWriteFile, lpcwbf, dwTemp); _llseek(hFileToOpen, lngOldPos, SEEK_SET); dwTemp = _lread(hFileToOpen, byteDataBuff, 480); lngOldPos = lngOldPos + dwTemp; if ( lngByteCount < (long)dwTemp0 )break; } _lclose(hWriteFile); } break; case 'C': case 'c': if(blHasBeenOpened) { _lclose(hFileToOpen); blHasBeenOpened = FALSE; lngFilePos = 0; blEndOfFile = FALSE; lngModifyPos=0; dwWriteByteCount = 0; for(j=15;j<80;j++)szScreenCache[j][30] = 6; } //cls the screen for(i=0;i<80;i++) for(j=0;j<30;j++) szScreenCache[i][j] = ' '; break; case 'A': case 'a': MessageBox(hWnd, szAboutStr, szTitle, MB_OK | MB_ICONASTERISK); break; case 'B': case 'b': intBackColor = ( intBackColor + 1 ) % 7; break; default: ; } for(i=0;i<80;i++)szScreenCache[i][31]=' '; intPosX = 0; return TRUE; } /* End CommandStrProc() ***************************************************/ /**************************************************************************** * * FUNCTION: ModifyDlgProc * * PURPOSE: Handles messages for Modify Dialog * * PARAMS: HWND hWnd - This window * UINT Msg - Which message? * WPARAM wParam - message parameter * LPARAM lParam - message parameter * * RETURNS: BOOL - depends on message * * History: * JAN 2007 - Created by AnSon.Man * Mar 2007 - Modified by AnSon.Man * \****************************************************************************/ BOOL CALLBACK ModifyDlgProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) { char szDlgItemBuff[128]={'\0'}; char szDlgDisBuff[128]={'\0'}; BYTE byteModifyBuff[16]; int i,j,k; BOOL blByteOk=FALSE; DWORD dwTemp, dwTemp0; switch( Msg ) { case WM_INITDIALOG: blCheckBox = FALSE; dwTemp = lngModifyPos; WORD2CHAR( szDlgItemBuff, HIWORD(dwTemp) ); szDlgItemBuff[4] = ':'; WORD2CHAR( szDlgItemBuff+5*sizeof(char), LOWORD(dwTemp) ); szDlgItemBuff[9] = '\0'; SetDlgItemText(hWnd, IDC_TEXT_ADD, szDlgItemBuff); _llseek(hFileToOpen, lngModifyPos, SEEK_SET); dwTemp = _lread(hFileToOpen, byteModifyBuff, 16); if(dwTemp==0) { PostMessage( hWnd, WM_COMMAND, IDCANCEL, 0l ); MessageBox(hWnd, szEndOfFile, szTitle, MB_OK | MB_ICONASTERISK); lngModifyPos = 0; break; } dwWriteByteCount = dwTemp; for(dwTemp0=0; dwTemp0<dwTemp; dwTemp0++) { szDlgItemBuff[dwTemp0 * 3 ] = (byteModifyBuff[dwTemp0] & 0xf0) >> 4; szDlgItemBuff[dwTemp0 * 3 ] = (szDlgItemBuff[dwTemp0 * 3 ]<10)?(szDlgItemBuff[dwTemp0 * 3 ]+48):(szDlgItemBuff[dwTemp0 * 3 ]+55); szDlgItemBuff[dwTemp0 * 3 + 1] = (byteModifyBuff[dwTemp0] & 0x0f); szDlgItemBuff[dwTemp0 * 3 + 1] = (szDlgItemBuff[dwTemp0 * 3 + 1]<10)?(szDlgItemBuff[dwTemp0 * 3 + 1]+48):(szDlgItemBuff[dwTemp0 * 3 + 1]+55); szDlgItemBuff[dwTemp0 * 3 + 2] = ' '; } szDlgItemBuff[dwTemp * 3 - 1] = '\0'; szDlgItemBuff[23] = '-'; SetDlgItemText(hWnd, IDC_TEXT_CUR, szDlgItemBuff); for(dwTemp0=0; dwTemp0<dwTemp; dwTemp0++) { if(byteModifyBuff[dwTemp0] < ' ' || byteModifyBuff[dwTemp0] > '~') szDlgItemBuff[dwTemp0 ] = '.'; else szDlgItemBuff[dwTemp0 ] = byteModifyBuff[dwTemp0]; } szDlgItemBuff[dwTemp] = '\0'; SetDlgItemText(hWnd, IDC_TEXT_CURCHAR, szDlgItemBuff); break; case WM_CLOSE: PostMessage( hWnd, WM_COMMAND, IDCANCEL, 0l ); break; case WM_COMMAND: switch( HIWORD(wParam) ) { case EN_CHANGE: blCheckBox = ! blCheckBox; PostMessage( hWnd, WM_COMMAND, IDPREVIEW, 0l ); break; default: ; } switch( LOWORD(wParam) ) { case IDOK: GetDlgItemText(hWnd, IDC_EDITTEXT, szDlgItemBuff, 127); if( ! blCheckBox) { i=k=0; while(szDlgItemBuff[i] != '\0') { j = i % 3; if(j==0) { if(szDlgItemBuff[i]<'0' || szDlgItemBuff[i] > 'f'){k=0;break;} if(szDlgItemBuff[i]>'9' && szDlgItemBuff[i] < 'A'){k=0;break;} if(szDlgItemBuff[i]>'F' && szDlgItemBuff[i] < 'a'){k=0;break;} byteModifyBuff[k] = char2byte( szDlgItemBuff[i] ) * 16; blByteOk = FALSE; } else if(j==1) { if(szDlgItemBuff[i]<'0' || szDlgItemBuff[i] > 'f'){k=0;break;} if(szDlgItemBuff[i]>'9' && szDlgItemBuff[i] < 'A'){k=0;break;} if(szDlgItemBuff[i]>'F' && szDlgItemBuff[i] < 'a'){k=0;break;} byteModifyBuff[k] += char2byte( szDlgItemBuff[i] ); k++; blByteOk = TRUE; if(k==16)break; } else if(szDlgItemBuff[i] != ' ' ){k=0;break;} i++; } if( k==0 || (! blByteOk) )break; _llseek(hFileToOpen, lngModifyPos, SEEK_SET); _lwrite(hFileToOpen, (LPCSTR)byteModifyBuff, k); } else { szDlgItemBuff[16] = '\0'; i=0; while(szDlgItemBuff[i] != '\0')i++; if (i==0)break; _llseek(hFileToOpen, lngModifyPos, SEEK_SET); _lwrite(hFileToOpen, (LPCSTR)szDlgItemBuff, i); } EndDialog( hWnd, TRUE ); break; case IDPREVIEW: blCheckBox = ! blCheckBox; GetDlgItemText(hWnd, IDC_EDITTEXT, szDlgItemBuff, 127); if( ! blCheckBox) { i=k=0; while(szDlgItemBuff[i] != '\0') { j = i % 3; if(j==0) { if(szDlgItemBuff[i]<'0' || szDlgItemBuff[i] > 'f'){k=0;break;} if(szDlgItemBuff[i]>'9' && szDlgItemBuff[i] < 'A'){k=0;break;} if(szDlgItemBuff[i]>'F' && szDlgItemBuff[i] < 'a'){k=0;break;} byteModifyBuff[k] = char2byte( szDlgItemBuff[i] ) * 16; blByteOk = FALSE; } else if(j==1) { if(szDlgItemBuff[i]<'0' || szDlgItemBuff[i] > 'f'){k=0;break;} if(szDlgItemBuff[i]>'9' && szDlgItemBuff[i] < 'A'){k=0;break;} if(szDlgItemBuff[i]>'F' && szDlgItemBuff[i] < 'a'){k=0;break;} byteModifyBuff[k] += char2byte( szDlgItemBuff[i] ); k++; blByteOk = TRUE; if(k==16)break; } else if(szDlgItemBuff[i] != ' ' ){ k=0;break; } i++; } if( ( ! blByteOk ) || k==0 ) SetDlgItemText(hWnd, IDC_TEXT_TIPS, szInputError); else SetDlgItemText(hWnd, IDC_TEXT_TIPS, szInputNoError); szDlgItemBuff[23] = '-'; szDlgItemBuff[47] = '\0'; SetDlgItemText(hWnd, IDC_TEXT_PRV, szDlgItemBuff); for(i=0;i<k;i++) { if(byteModifyBuff[i] < ' ' || byteModifyBuff[i] > '~') szDlgDisBuff[i] = '.'; else szDlgDisBuff[i] = byteModifyBuff[i]; } szDlgDisBuff[i] = '\0'; SetDlgItemText(hWnd, IDC_TEXT_PRVCHAR, szDlgDisBuff); } else { SetDlgItemText(hWnd, IDC_TEXT_TIPS, szInputNoError); szDlgItemBuff[16] = '\0'; SetDlgItemText(hWnd, IDC_TEXT_PRV, szDlgItemBuff); SetDlgItemText(hWnd, IDC_TEXT_PRVCHAR, szDlgItemBuff); } break; case IDCANCEL: EndDialog( hWnd, FALSE ); break; default: ; } break; default: return FALSE; } return TRUE; } /* End ModifyDlgProc() ****************************************************/ /**************************************************************************** * * FUNCTION: char2int(char a) * * PURPOSE: convert one HEX's char into int, for example: 'A' -> 10, '0' -> 0; * * PARAMS: char a - HEX's char * * RETURNS: int - return the int value * * History: * Mar 2007 - Created by AnSon.Man * \****************************************************************************/ int char2int(char a) { int rs; if ( a>='0' && a<='9' )rs = (a - '0'); else if( a>='A' && a<='F' )rs = (a - 'A'+10); else if( a>='a' && a<='f' )rs = (a - 'a'+10); else rs = -1; return rs; } /* End char2int() ***************************************************/ BYTE char2byte(char a) { if(a<'A') return (a - '0'); if(a<'a') return (a - 'A' + 10); return (a - 'a' + 10); } char CHAR2HEXTXT(char a) { char b; if(a<0 || a>15)return ((char)(0xff)); b = (a<10)?(a+48):(a+55); return b; } void WORD2CHAR(char FAR* a, WORD b) { *a = (char)((b & 0xf000) >> 12); *a = ((*a) <= 9)?(*a + 48):(*a + 55); *(a+1) = (char)((b & 0x0f00) >> 8); *(a+1) = ((*(a+1)) <= 9)?(*(a+1) + 48):(*(a+1) + 55); *(a+2) = (char)((b & 0x00f0) >> 4); *(a+2) = ((*(a+2)) <= 9)?(*(a+2) + 48):(*(a+2) + 55); *(a+3) = (char)(b & 0x000f); *(a+3) = ((*(a+3)) <= 9)?(*(a+3) + 48):(*(a+3) + 55); } char WORD2CHARINDEX(WORD b, int index) { char a; b = b & (0xf000 >> (index*4)); b = b >> (12 - index * 4); a = (char)b; a = (a <= 9)?(a+48):(a+55); return a; } BOOL GetCmdLineValue(long FAR* lngTemp) { DWORD dwTemp0, dwIndex; if(intPosX == 5) { if( char2int( szScreenCache[1][31] ) == -1 )return FALSE; if( char2int( szScreenCache[2][31] ) == -1 )return FALSE; if( char2int( szScreenCache[3][31] ) == -1 )return FALSE; if( char2int( szScreenCache[4][31] ) == -1 )return FALSE; dwIndex = ((DWORD)(char2int( szScreenCache[1][31] )))*0x1000 + ((DWORD)(char2int( szScreenCache[2][31] )))*0x100 + ((DWORD)(char2int( szScreenCache[3][31] )))*0x10 + ((DWORD)(char2int( szScreenCache[4][31] ))); dwTemp0 = *lngTemp; dwTemp0 = (dwTemp0 - ( dwTemp0 % 0x10000 ) + dwIndex); *lngTemp = dwTemp0; return TRUE; } else if(intPosX == 10) { if( char2int( szScreenCache[1][31] ) == -1 )return FALSE; if( char2int( szScreenCache[2][31] ) == -1 )return FALSE; if( char2int( szScreenCache[3][31] ) == -1 )return FALSE; if( char2int( szScreenCache[4][31] ) == -1 )return FALSE; dwIndex = ((DWORD)(char2int( szScreenCache[1][31] )))*0x1000 + ((DWORD)(char2int( szScreenCache[2][31] )))*0x100 + ((DWORD)(char2int( szScreenCache[3][31] )))*0x10 + ((DWORD)(char2int( szScreenCache[4][31] ))); if( char2int( szScreenCache[6][31] ) == -1 )return FALSE; if( char2int( szScreenCache[7][31] ) == -1 )return FALSE; if( char2int( szScreenCache[8][31] ) == -1 )return FALSE; if( char2int( szScreenCache[9][31] ) == -1 )return FALSE; dwTemp0 = ((DWORD)(char2int( szScreenCache[6][31] )))*0x1000 + ((DWORD)(char2int( szScreenCache[7][31] )))*0x100 + ((DWORD)(char2int( szScreenCache[8][31] )))*0x10 + ((DWORD)(char2int( szScreenCache[9][31] ))); dwIndex = (dwIndex << 16) + dwTemp0; *lngTemp = dwIndex; return TRUE; } else if(intPosX == 1) return TRUE; else return FALSE; }